/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */

package jp.ize.ux.components;

// {{{ imports
import jp.ize.ux.UXObject;
import jp.ize.ux.UXController;
import jp.ize.ux.UXInteraction;
import jp.ize.ux.acts.Act;
import jp.ize.ux.acts.LinearAct;
import jp.ize.ux.geom.UXPoint;
import jp.ize.ux.states.UXLinearState;
import jp.ize.ux.tween.easings.Expo;
// }}}
// {{{ class UXLinearBoxCoState
class UXLinearBoxCoState
{
	// {{{ public var focused(default, default) : Bool
	/**
	 * フォーカスが当たっているかどうかを取得、または設定します。
	 */
	public var focused(default, default) : Bool;
	// }}}
	// {{{ public var highlighted(default, default) : Bool
	/**
	 * ハイライトされているかどうかを取得、または設定します。
	 */
	public var highlighted(default, default) : Bool;
	// }}}
}
// }}}
// {{{ enum UXLinearBoxExclusiveState
/**
 * UXLinearの各種状況を表現します。
 */
enum UXLinearBoxExclusiveState
{
	/** 初期化状態にある事を意味します。*/
	INIT;
	/** 無効になっている事を意味します。*/
	DISABLE;
	/** 有効になっている事を意味します。パラメーターでは、フォーカスやハイライトの状況を保持します。*/
	ENABLE ( flags : UXLinearBoxCoState );
}
// }}}
// {{{ class UXLinearBoxState extends UXLinearState
class UXLinearBoxState extends UXLinearState
{
	// {{{ public function new( startp : UXPoint, endp : UXPoint )
	/**
	 * コンストラクタです。
	 *
	 * @param startp: レイアウト開始座標を指定します。
	 * @param   endp: レイアウト終了座標を指定します。
	 */
	public function new( startp : UXPoint, endp : UXPoint )
	{
		super( startp, endp, 0.0 );
	}
	// }}}
	// {{{ public var background(default, default) : UXObject
	/**
	 * 背景となるオブジェクトです。デフォルトはnullです。
	 */
	public var background(default, default) : UXObject;
	// }}}
	// {{{ public var condition( default, default) : UXLinearBoxExclusiveState;
	/**
	 * enableかどうかやフォーカスが当たっているかなど各種状況を保持する変数です。
	 */
	public var condition( default, default) : UXLinearBoxExclusiveState;
	// }}}
}
// }}}

// {{{ class UXLinearBox extends UXComponent<UXLinearBoxState>
/**
 * UXLinearBoxクラス.<br>
 * Linearレイアウトと背景を持つコンポーネント。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id$<br>
 */
class UXLinearBox extends UXComponent<UXLinearBoxState>
{
	// {{{ public function new( startp : UXPoint, endp : UXPoint ) : Void
	/**
	 * コンストラクタです。
	 *
	 * @param startp: レイアウト開始座標を指定します。
	 * @param   endp: レイアウト終了座標を指定します。
	 */
	public function new( startp : UXPoint, endp : UXPoint ) : Void
	{
		state = new UXLinearBoxState( startp, endp );
		state.target = this;
		state.cyclic = true;
		ctrl = new UXController<UXLinearBoxState>( state );
		ctrl.addInteraction (new UXLinearBoxLayoutInteraction());
		ctrl.addInteraction (new UXLinearBoxFishEyeInteraction());
		super( ctrl );
		var a = new LinearAct();
		var actparam1:ActParameter = {
			time:0.3,
			transition:Expo.easeOut,
		};
		ctrl.getInteraction("Layout").defaults.push(a.layout(actparam1));
		ctrl.getInteraction("Layout").setDefaultActs();
	}

	// }}}
	// {{{ public function setBackground( back : UXObject ) : Void
	/**
	 * 背景となるオブジェクトを設定できます。
	 */
	public function setBackground( back : UXObject ) : Void
	{
		//removeChild( _obj );
		//_obj = back;
		//addChild( _obj );
	}
	// }}}
	// {{{ public function addUXChild( c:UXObject ) : Void
	/**
	 * addChild オーバーライドメソッドです。引数として受け取った子オブジェクトを追加し、
	 * このコンポーネントの状態やコントーラーに反映させます。
	 */
	public override function addUXChild( c:UXObject ) : Void
	{
		super.addUXChild( c );
		state.children.push( c );
	}
	// }}}
	// {{{ public function removeUXChild( c : UXObject ) : Void
	/**
	 * removeChild オーバーライドメソッドです。引数として受け取った子オブジェクトを削除し、
	 * このコンポーネントの状態やコントローラーに反映させます。
	 */
	public override function removeUXChild( c : UXObject ) : Void
	{
		super.removeUXChild(c);
	}
	// }}}
	// {{{ public function update( updator : UXLinearBoxState -> Void ) : Void
	/**
	 * このコンポーネントの状態を直接変更するメソッドです。状態のどんな操作も可能になるので、
	 * このメソッドの使用には注意が必要です。
	 */
	public function update( updator : UXLinearBoxState -> Void ) : Void
	{
		updator( state );
	}
	// }}}
}
// }}}

// {{{ class UXLinearBoxLayoutInteraction extends UXInteraction<UXLinearBoxState>
/**
 * UXLinearBoxLayoutInteraction クラス<br>
 * 直線上に子コンポーネントを配置するデフォルトインタラクションです。
 */
class UXLinearBoxLayoutInteraction extends UXInteraction<UXLinearBoxState>
{
	// {{{ public function new()
	/**
	 * コンストラクタです。
	 */
	public function new()
	{
		super();
		name = "LinearLayout";
		var actparam:ActParameter = {
			time:0.3,
			transition:Expo.easeOut
		};
		addAct( (new LinearAct()).layout(actparam) );
	}
	// }}}
}
// }}}
// {{{ class UXLinearBoxFishEyeInteraction extends UXInteraction<UXLinearBoxState>
/**
 * UXLinearBoxFishEyeInteraction クラス<br>
 * 直線上に子コンポーネントを配置するデフォルトインタラクションです。
 */
class UXLinearBoxFishEyeInteraction extends UXInteraction<UXLinearBoxState>
{
	// {{{ public function new()
	/**
	 * コンストラクタです。
	 */
	public function new()
	{
		super();
		name = "LinearFishEye";
		var actparam:FishEyeParameter = {
			time:0.3,
			transition:Expo.easeOut,
			centerScale:2.0,
			effectRange:2
		};
		addAct( (new LinearAct()).fishEye(actparam) );
	}
	// }}}
}
// }}}
